/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package logica.jpaControllers;

import Entidades.Detallerecepcion;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import Entidades.Recepcion;
import Entidades.Stockproducto;
import Entidades.Producto;
import Entidades.Lagar;
import Entidades.Estadoespera;
import Entidades.Empaque;
import Entidades.Condicion;
import Entidades.Pesajesalida;
import Entidades.Pesajeentrada;
import logica.jpaControllers.exceptions.NonexistentEntityException;

/**
 *
 * @author Anali
 */
public class DetallerecepcionJpaController {

    public DetallerecepcionJpaController() {
        emf = Persistence.createEntityManagerFactory("GestorPesajeJpaPU2");
    }
    private EntityManagerFactory emf = null;

    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    public void create(Detallerecepcion detallerecepcion) {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Recepcion recepcion = detallerecepcion.getRecepcion();
            if (recepcion != null) {
                recepcion = em.getReference(recepcion.getClass(), recepcion.getNumeroRecepcion());
                detallerecepcion.setRecepcion(recepcion);
            }
            Stockproducto stockproducto = detallerecepcion.getStockproducto();
            if (stockproducto != null) {
                stockproducto = em.getReference(stockproducto.getClass(), stockproducto.getIdStock());
                detallerecepcion.setStockproducto(stockproducto);
            }
            Producto producto = detallerecepcion.getProducto();
            if (producto != null) {
                producto = em.getReference(producto.getClass(), producto.getIdProducto());
                detallerecepcion.setProducto(producto);
            }
            Lagar lagar = detallerecepcion.getLagar();
            if (lagar != null) {
                lagar = em.getReference(lagar.getClass(), lagar.getIdLagar());
                detallerecepcion.setLagar(lagar);
            }
            Estadoespera estadoespera = detallerecepcion.getEstadoespera();
            if (estadoespera != null) {
                estadoespera = em.getReference(estadoespera.getClass(), estadoespera.getIdEstadoEspera());
                detallerecepcion.setEstadoespera(estadoespera);
            }
            Empaque empaque = detallerecepcion.getEmpaque();
            if (empaque != null) {
                empaque = em.getReference(empaque.getClass(), empaque.getIdEmpaque());
                detallerecepcion.setEmpaque(empaque);
            }
            Condicion condicion = detallerecepcion.getCondicion();
            if (condicion != null) {
                condicion = em.getReference(condicion.getClass(), condicion.getIdCondicion());
                detallerecepcion.setCondicion(condicion);
            }
            Pesajesalida pesajesalida = detallerecepcion.getPesajesalida();
            if (pesajesalida != null) {
                pesajesalida = em.getReference(pesajesalida.getClass(), pesajesalida.getIdpesajesalida());
                detallerecepcion.setPesajesalida(pesajesalida);
            }
            Pesajeentrada pesajeentrada = detallerecepcion.getPesajeentrada();
            if (pesajeentrada != null) {
                pesajeentrada = em.getReference(pesajeentrada.getClass(), pesajeentrada.getIdpesajeentrada());
                detallerecepcion.setPesajeentrada(pesajeentrada);
            }
            em.persist(detallerecepcion);
            if (recepcion != null) {
                recepcion.getDetallerecepcionCollection().add(detallerecepcion);
                recepcion = em.merge(recepcion);
            }
            if (stockproducto != null) {
                stockproducto.getDetallerecepcionCollection().add(detallerecepcion);
                stockproducto = em.merge(stockproducto);
            }
            if (producto != null) {
                producto.getDetallerecepcionCollection().add(detallerecepcion);
                producto = em.merge(producto);
            }
            if (lagar != null) {
                lagar.getDetallerecepcionCollection().add(detallerecepcion);
                lagar = em.merge(lagar);
            }
            if (estadoespera != null) {
                estadoespera.getDetallerecepcionCollection().add(detallerecepcion);
                estadoespera = em.merge(estadoespera);
            }
            if (empaque != null) {
                empaque.getDetallerecepcionCollection().add(detallerecepcion);
                empaque = em.merge(empaque);
            }
            if (condicion != null) {
                condicion.getDetallerecepcionCollection().add(detallerecepcion);
                condicion = em.merge(condicion);
            }
            if (pesajesalida != null) {
                pesajesalida.getDetallerecepcionCollection().add(detallerecepcion);
                pesajesalida = em.merge(pesajesalida);
            }
            if (pesajeentrada != null) {
                pesajeentrada.getDetallerecepcionCollection().add(detallerecepcion);
                pesajeentrada = em.merge(pesajeentrada);
            }
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void edit(Detallerecepcion detallerecepcion) throws NonexistentEntityException, Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Detallerecepcion persistentDetallerecepcion = em.find(Detallerecepcion.class, detallerecepcion.getIdDetalleRecepcion());
            Recepcion recepcionOld = persistentDetallerecepcion.getRecepcion();
            Recepcion recepcionNew = detallerecepcion.getRecepcion();
            Stockproducto stockproductoOld = persistentDetallerecepcion.getStockproducto();
            Stockproducto stockproductoNew = detallerecepcion.getStockproducto();
            Producto productoOld = persistentDetallerecepcion.getProducto();
            Producto productoNew = detallerecepcion.getProducto();
            Lagar lagarOld = persistentDetallerecepcion.getLagar();
            Lagar lagarNew = detallerecepcion.getLagar();
            Estadoespera estadoesperaOld = persistentDetallerecepcion.getEstadoespera();
            Estadoespera estadoesperaNew = detallerecepcion.getEstadoespera();
            Empaque empaqueOld = persistentDetallerecepcion.getEmpaque();
            Empaque empaqueNew = detallerecepcion.getEmpaque();
            Condicion condicionOld = persistentDetallerecepcion.getCondicion();
            Condicion condicionNew = detallerecepcion.getCondicion();
            Pesajesalida pesajesalidaOld = persistentDetallerecepcion.getPesajesalida();
            Pesajesalida pesajesalidaNew = detallerecepcion.getPesajesalida();
            Pesajeentrada pesajeentradaOld = persistentDetallerecepcion.getPesajeentrada();
            Pesajeentrada pesajeentradaNew = detallerecepcion.getPesajeentrada();
            if (recepcionNew != null) {
                recepcionNew = em.getReference(recepcionNew.getClass(), recepcionNew.getNumeroRecepcion());
                detallerecepcion.setRecepcion(recepcionNew);
            }
            if (stockproductoNew != null) {
                stockproductoNew = em.getReference(stockproductoNew.getClass(), stockproductoNew.getIdStock());
                detallerecepcion.setStockproducto(stockproductoNew);
            }
            if (productoNew != null) {
                productoNew = em.getReference(productoNew.getClass(), productoNew.getIdProducto());
                detallerecepcion.setProducto(productoNew);
            }
            if (lagarNew != null) {
                lagarNew = em.getReference(lagarNew.getClass(), lagarNew.getIdLagar());
                detallerecepcion.setLagar(lagarNew);
            }
            if (estadoesperaNew != null) {
                estadoesperaNew = em.getReference(estadoesperaNew.getClass(), estadoesperaNew.getIdEstadoEspera());
                detallerecepcion.setEstadoespera(estadoesperaNew);
            }
            if (empaqueNew != null) {
                empaqueNew = em.getReference(empaqueNew.getClass(), empaqueNew.getIdEmpaque());
                detallerecepcion.setEmpaque(empaqueNew);
            }
            if (condicionNew != null) {
                condicionNew = em.getReference(condicionNew.getClass(), condicionNew.getIdCondicion());
                detallerecepcion.setCondicion(condicionNew);
            }
            if (pesajesalidaNew != null) {
                pesajesalidaNew = em.getReference(pesajesalidaNew.getClass(), pesajesalidaNew.getIdpesajesalida());
                detallerecepcion.setPesajesalida(pesajesalidaNew);
            }
            if (pesajeentradaNew != null) {
                pesajeentradaNew = em.getReference(pesajeentradaNew.getClass(), pesajeentradaNew.getIdpesajeentrada());
                detallerecepcion.setPesajeentrada(pesajeentradaNew);
            }
            detallerecepcion = em.merge(detallerecepcion);
            if (recepcionOld != null && !recepcionOld.equals(recepcionNew)) {
                recepcionOld.getDetallerecepcionCollection().remove(detallerecepcion);
                recepcionOld = em.merge(recepcionOld);
            }
            if (recepcionNew != null && !recepcionNew.equals(recepcionOld)) {
                recepcionNew.getDetallerecepcionCollection().add(detallerecepcion);
                recepcionNew = em.merge(recepcionNew);
            }
            if (stockproductoOld != null && !stockproductoOld.equals(stockproductoNew)) {
                stockproductoOld.getDetallerecepcionCollection().remove(detallerecepcion);
                stockproductoOld = em.merge(stockproductoOld);
            }
            if (stockproductoNew != null && !stockproductoNew.equals(stockproductoOld)) {
                stockproductoNew.getDetallerecepcionCollection().add(detallerecepcion);
                stockproductoNew = em.merge(stockproductoNew);
            }
            if (productoOld != null && !productoOld.equals(productoNew)) {
                productoOld.getDetallerecepcionCollection().remove(detallerecepcion);
                productoOld = em.merge(productoOld);
            }
            if (productoNew != null && !productoNew.equals(productoOld)) {
                productoNew.getDetallerecepcionCollection().add(detallerecepcion);
                productoNew = em.merge(productoNew);
            }
            if (lagarOld != null && !lagarOld.equals(lagarNew)) {
                lagarOld.getDetallerecepcionCollection().remove(detallerecepcion);
                lagarOld = em.merge(lagarOld);
            }
            if (lagarNew != null && !lagarNew.equals(lagarOld)) {
                lagarNew.getDetallerecepcionCollection().add(detallerecepcion);
                lagarNew = em.merge(lagarNew);
            }
            if (estadoesperaOld != null && !estadoesperaOld.equals(estadoesperaNew)) {
                estadoesperaOld.getDetallerecepcionCollection().remove(detallerecepcion);
                estadoesperaOld = em.merge(estadoesperaOld);
            }
            if (estadoesperaNew != null && !estadoesperaNew.equals(estadoesperaOld)) {
                estadoesperaNew.getDetallerecepcionCollection().add(detallerecepcion);
                estadoesperaNew = em.merge(estadoesperaNew);
            }
            if (empaqueOld != null && !empaqueOld.equals(empaqueNew)) {
                empaqueOld.getDetallerecepcionCollection().remove(detallerecepcion);
                empaqueOld = em.merge(empaqueOld);
            }
            if (empaqueNew != null && !empaqueNew.equals(empaqueOld)) {
                empaqueNew.getDetallerecepcionCollection().add(detallerecepcion);
                empaqueNew = em.merge(empaqueNew);
            }
            if (condicionOld != null && !condicionOld.equals(condicionNew)) {
                condicionOld.getDetallerecepcionCollection().remove(detallerecepcion);
                condicionOld = em.merge(condicionOld);
            }
            if (condicionNew != null && !condicionNew.equals(condicionOld)) {
                condicionNew.getDetallerecepcionCollection().add(detallerecepcion);
                condicionNew = em.merge(condicionNew);
            }
            if (pesajesalidaOld != null && !pesajesalidaOld.equals(pesajesalidaNew)) {
                pesajesalidaOld.getDetallerecepcionCollection().remove(detallerecepcion);
                pesajesalidaOld = em.merge(pesajesalidaOld);
            }
            if (pesajesalidaNew != null && !pesajesalidaNew.equals(pesajesalidaOld)) {
                pesajesalidaNew.getDetallerecepcionCollection().add(detallerecepcion);
                pesajesalidaNew = em.merge(pesajesalidaNew);
            }
            if (pesajeentradaOld != null && !pesajeentradaOld.equals(pesajeentradaNew)) {
                pesajeentradaOld.getDetallerecepcionCollection().remove(detallerecepcion);
                pesajeentradaOld = em.merge(pesajeentradaOld);
            }
            if (pesajeentradaNew != null && !pesajeentradaNew.equals(pesajeentradaOld)) {
                pesajeentradaNew.getDetallerecepcionCollection().add(detallerecepcion);
                pesajeentradaNew = em.merge(pesajeentradaNew);
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                Integer id = detallerecepcion.getIdDetalleRecepcion();
                if (findDetallerecepcion(id) == null) {
                    throw new NonexistentEntityException("The detallerecepcion with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void destroy(Integer id) throws NonexistentEntityException {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Detallerecepcion detallerecepcion;
            try {
                detallerecepcion = em.getReference(Detallerecepcion.class, id);
                detallerecepcion.getIdDetalleRecepcion();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The detallerecepcion with id " + id + " no longer exists.", enfe);
            }
            Recepcion recepcion = detallerecepcion.getRecepcion();
            if (recepcion != null) {
                recepcion.getDetallerecepcionCollection().remove(detallerecepcion);
                recepcion = em.merge(recepcion);
            }
            Stockproducto stockproducto = detallerecepcion.getStockproducto();
            if (stockproducto != null) {
                stockproducto.getDetallerecepcionCollection().remove(detallerecepcion);
                stockproducto = em.merge(stockproducto);
            }
            Producto producto = detallerecepcion.getProducto();
            if (producto != null) {
                producto.getDetallerecepcionCollection().remove(detallerecepcion);
                producto = em.merge(producto);
            }
            Lagar lagar = detallerecepcion.getLagar();
            if (lagar != null) {
                lagar.getDetallerecepcionCollection().remove(detallerecepcion);
                lagar = em.merge(lagar);
            }
            Estadoespera estadoespera = detallerecepcion.getEstadoespera();
            if (estadoespera != null) {
                estadoespera.getDetallerecepcionCollection().remove(detallerecepcion);
                estadoespera = em.merge(estadoespera);
            }
            Empaque empaque = detallerecepcion.getEmpaque();
            if (empaque != null) {
                empaque.getDetallerecepcionCollection().remove(detallerecepcion);
                empaque = em.merge(empaque);
            }
            Condicion condicion = detallerecepcion.getCondicion();
            if (condicion != null) {
                condicion.getDetallerecepcionCollection().remove(detallerecepcion);
                condicion = em.merge(condicion);
            }
            Pesajesalida pesajesalida = detallerecepcion.getPesajesalida();
            if (pesajesalida != null) {
                pesajesalida.getDetallerecepcionCollection().remove(detallerecepcion);
                pesajesalida = em.merge(pesajesalida);
            }
            Pesajeentrada pesajeentrada = detallerecepcion.getPesajeentrada();
            if (pesajeentrada != null) {
                pesajeentrada.getDetallerecepcionCollection().remove(detallerecepcion);
                pesajeentrada = em.merge(pesajeentrada);
            }
            em.remove(detallerecepcion);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public List<Detallerecepcion> findDetallerecepcionEntities() {
        return findDetallerecepcionEntities(true, -1, -1);
    }

    public List<Detallerecepcion> findDetallerecepcionEntities(int maxResults, int firstResult) {
        return findDetallerecepcionEntities(false, maxResults, firstResult);
    }

    private List<Detallerecepcion> findDetallerecepcionEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            Query q = em.createQuery("select object(o) from Detallerecepcion as o");
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

    public Detallerecepcion findDetallerecepcion(Integer id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(Detallerecepcion.class, id);
        } finally {
            em.close();
        }
    }

    public int getDetallerecepcionCount() {
        EntityManager em = getEntityManager();
        try {
            Query q = em.createQuery("select count(o) from Detallerecepcion as o");
            return ((Long) q.getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }
//    public List<Detallerecepcion> findDetallerecepcion_x_pesajeentrada() {
//        EntityManager em = getEntityManager();
////        Estadoespera estado = new Estadoespera();
////        estado.setIdEstadoEspera(2);
//        try {
//            Query q = em.createNamedQuery("Detallerecepcion.findByEstado");
//          //  q.setParameter("estado", estado.getIdEstadoEspera());
//            //q.setParameter("proveedor", proveedor);
//            return q.getResultList();
//        } finally {
//            em.close();
//        }
//    }

//
    public List<Detallerecepcion> findDetallerecepcionByEstado() {
        Estadoespera estado = new Estadoespera();
        estado.setIdEstadoEspera(2);//PesoEntradaPendiente
        EntityManager em = getEntityManager();
        try {
            Query q = em.createNamedQuery("Detallerecepcion.findByEstado");
            q.setParameter("estado", estado.getIdEstadoEspera());
            return q.getResultList();
        } finally {
            em.close();
        }


    }

    public List<Detallerecepcion> findDetallerecepcionByEstadoSalida() {
        Estadoespera estado = new Estadoespera();
        estado.setIdEstadoEspera(3);//PesoSalidaPendiente
        EntityManager em = getEntityManager();
        try {
            Query q = em.createNamedQuery("Detallerecepcion.findByEstado");
            q.setParameter("estado", estado.getIdEstadoEspera());
            return q.getResultList();
        } finally {
            em.close();
        }
    }

    public List<Detallerecepcion> findDetallerecepcionByEstadoDescargaLagar() {
        Estadoespera estado = new Estadoespera();
        estado.setIdEstadoEspera(6);//DescargaLagarPendiente
        EntityManager em = getEntityManager();
        try {
            Query q = em.createNamedQuery("Detallerecepcion.findByEstado");
            q.setParameter("estado", estado.getIdEstadoEspera());
            return q.getResultList();
        } finally {
            em.close();
        }
    }
}
